home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / HTML / Crypt.php < prev    next >
PHP Script  |  2004-03-24  |  6KB  |  244 lines

  1. <?php 
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2002 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Michael Dransfield <mike@blueroot.net>                      |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id$
  20.  
  21.  
  22. /**
  23.  * PEAR::HTML_Crypt
  24.  *
  25.  * The PEAR::HTML_Crypt provides methods to encrypt text, which 
  26.  * can be later be decrypted using JavaScript on the client side
  27.  *
  28.  * This is very useful to prevent spam robots collecting email
  29.  * addresses from your site, included is a method to add mailto 
  30.  * links to the text being generated
  31.  * 
  32.  *  a basic example to encrypt an email address
  33.  *  $c = new HTML_Crypt('yourname@emailaddress.com', 8);
  34.  *  $c->addMailTo();
  35.  *  $c->output();
  36.  *
  37.  * @author  Michael Dransfield <mike@blueroot.net>
  38.  * @package HTML_Crypt
  39.  * @version $Revision: 1.2.1 $
  40.  */
  41. class HTML_Crypt
  42. {
  43.     // {{{ properties
  44.  
  45.     /**
  46.      * The unencrypted text
  47.      *
  48.      * @access public
  49.      * @var    string
  50.      * @see    setText()
  51.      */
  52.      var $text = '';
  53.      
  54.     /**
  55.      * The full javascript to be sent to the browser
  56.      *
  57.      * @access public
  58.      * @var    string
  59.      * @see    getScript()
  60.      */
  61.      var $script = '';
  62.      
  63.      
  64.     /**
  65.      * The text encrypted - without any js
  66.      *
  67.      * @access public
  68.      * @var    string
  69.      * @see    cyrptText
  70.      */
  71.      var $cryptString = '';
  72.      
  73.      
  74.     /**
  75.      * The number to offset the text by
  76.      *
  77.      * @access public
  78.      * @var    int
  79.      */
  80.      var $offset;
  81.      
  82.     /**
  83.      * Whether or not to use JS for encryption or simple html
  84.      *
  85.      * @access public
  86.      * @var    int
  87.      */
  88.      var $useJS; 
  89.          
  90.     /**
  91.      * a preg expression for an <a href=mailto: ... tag
  92.      *
  93.      * @access public
  94.      * @var    string
  95.      */
  96.      var $apreg;
  97.      
  98.          
  99.     /**
  100.      * a preg expression for an email
  101.      *
  102.      * @access public
  103.      * @var    string
  104.      */
  105.      var $emailpreg;
  106.      
  107.     // }}}
  108.     // {{{ HTML_Crypt()
  109.  
  110.     /**
  111.      * Constructor
  112.      *
  113.      * @access public
  114.      * @param string $text  The text to encrypt
  115.      * @param int $offset  The offset used to encrypt/decrypt
  116.      */
  117.     function HTML_Crypt($text = '', $offset = 3, $JS = true)
  118.     {
  119.         $this->offset = $offset;
  120.         $this->text = $text;
  121.         $this->script = '';
  122.         $this->useJS = $JS;
  123.         $this->emailpreg = '[-_a-z0-9]+(\.[-_a-z0-9]+)*@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]{2,6}';
  124.         $this->apreg = '\<[aA]\shref=[\"\']mailto:.*\<\/[aA]\>';
  125.     }
  126.     
  127.     // }}}
  128.     // {{{ setText()
  129.  
  130.     /**
  131.      * Set name of the current realm
  132.      *
  133.      * @access public
  134.      * @param  string $text  The text to be encrypted
  135.      */
  136.     function setText($text)
  137.     {
  138.         $this->text = $text;
  139.     }
  140.     
  141.     // }}}
  142.     // {{{ addMailTo()
  143.  
  144.     /**
  145.      * Turns the text into a mailto link (make sure 
  146.      * the text only contains an email)
  147.      *
  148.      * @access public
  149.      */
  150.     function addMailTo()
  151.     {
  152.         $email = $this->text;
  153.         $this->text = '<a href="mailto:'.$email.'">'.$email.'</a>';
  154.     }
  155.     
  156.     // }}}
  157.     // {{{ cryptText()
  158.  
  159.     /**
  160.      * Encrypts the text
  161.      *
  162.      * @access private
  163.      */
  164.     function cryptText()
  165.     {
  166.         $enc_string = '';
  167.         $length = strlen($this->text);        
  168.  
  169.         for ($i=0; $i < $length; $i++) {
  170.             $current_chr = substr($this->text, $i, 1);
  171.             $inter = ord($current_chr)+$this->offset;
  172.             $enc_char =  chr($inter);
  173.             $enc_string .= ($enc_char == '\\' ? '\\\\' : $enc_char);
  174.         }
  175.  
  176.         $this->cryptString = $enc_string;
  177.     }
  178.     
  179.     // }}}
  180.     // {{{ getScript()
  181.  
  182.     /**
  183.      * Returns the script html source including the function to decrypt it
  184.      *
  185.      * @access public
  186.      * @return string $script The javascript generated
  187.      */
  188.     function getScript()
  189.     {
  190.         if ($this->cryptString == '' && $this->text != '') {
  191.             $this->cryptText();
  192.         }
  193.         // get a random string to use as a function name
  194.         srand((float) microtime() * 10000000);
  195.         $letters = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
  196.         $rnd = $letters[array_rand($letters)] . md5(time());
  197.         // the actual js (in one line to confuse)
  198.         $script = "<script language=\"JavaScript\" type=\"text/JavaScript\">var a,s,n;function $rnd(s){r='';for(i=0;i<s.length;i++){n=s.charCodeAt(i);if(n>=8364){n=128;}r+=String.fromCharCode(n-".$this->offset.");}return r;}a='".$this->cryptString."';document.write ($rnd(a));</script>";
  199.         $this->script = $script;
  200.         return $script;
  201.     }
  202.     
  203.     // }}}
  204.     // {{{ output()
  205.  
  206.     /**
  207.      * Outputs the full JS to the browser
  208.      *
  209.      * @access public
  210.      */
  211.     function output()
  212.     {
  213.         if ($this->useJS) {
  214.             if ($this->script == '') {
  215.                 $this->getScript();
  216.             }
  217.             echo $this->script;
  218.         } else {
  219.             echo str_replace(array('@', '.'), array(' ^at^ ', '-dot-'), $this->text);
  220.         }
  221.     }
  222.     
  223.     function obStart()
  224.     {
  225.         ob_start();
  226.     }
  227.     
  228.     function obEnd()
  229.     {
  230.         $text = ob_get_contents();
  231.         $text = preg_replace_callback("/{$this->apreg}/", array($this, '_fly'), $text);
  232.         ob_end_clean();
  233.         echo $text;
  234.     }
  235.     
  236.     function _fly($text)
  237.     {
  238.         $c = new HTML_Crypt($text[0]);
  239.         $c->setText($text[0]);
  240.         return $c->getScript();
  241.     }
  242. }
  243. ?>
  244.